//
//  NSDate+ZSExtend.h
//  Epayment
//
//  Created by safiri on 2018/6/13.
//  Copyright © 2018年 safiri. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "NSDate+ZSExtension.h"

#define FormatString1 @"yyyy-MM-dd HH:mm:ss"
#define FormatString2 @"yyyy年MM月dd日"
#define FormatYMD @"yyyy-MM-dd"

@interface NSDate (ZSExtend)

///时间戳转化为dateFormat指定格式时间字符串 timeString为秒
+ (NSString *)timeWithTimeIntervalString:(NSString *)timeString andFormat:(NSString *)dateFormat;
//当前时间戳,单位为秒
+ (NSString *)timestampNow;


/// 返回昨天的同一时刻的NSDate
+(NSDate *)yesterday;

+(NSDateFormatter *)formatter;
+(NSDateFormatter *)formatterShort;
+(NSDateFormatter *)formatterWithoutTime;
+(NSDateFormatter *)formatterWithoutDate;

/// 获取现在的UTC +00:00 校准的全球时间
-(NSString *)formatWithUTCTimeZone;
/// 获取系统所在时区的时间
-(NSString *)formatWithLocalTimeZone;
/// 距GMT间隔时区的时间
-(NSString *)formatWithTimeZoneOffset:(NSTimeInterval)offset;
/// 当前指定时区的时间
-(NSString *)formatWithTimeZone:(NSTimeZone *)timezone;

-(NSString *)formatWithUTCTimeZoneWithoutTime;
-(NSString *)formatWithLocalTimeZoneWithoutTime;
-(NSString *)formatWithTimeZoneOffsetWithoutTime:(NSTimeInterval)offset;
-(NSString *)formatWithTimeZoneWithoutTime:(NSTimeZone *)timezone;

-(NSString *)formatWithUTCWithoutDate;
-(NSString *)formatWithLocalTimeWithoutDate;
-(NSString *)formatWithTimeZoneOffsetWithoutDate:(NSTimeInterval)offset;
-(NSString *)formatTimeWithTimeZone:(NSTimeZone *)timezone;

///当前时间 yyyy-MM-dd HH:mm:ss
+ (NSString *)currentDateStringNorm;
///当前时间 yyyyMMddhhmmss
+ (NSString *)currentDateStringNorm2;
///当前时间 yyyy-MM-dd
+ (NSString *)currentDateStringNorm3;
///当前format格式的时间
+ (NSString *)currentDateStringWithFormat:(NSString *)format;
///当前时间未来seconds秒的日期
+ (NSDate *)dateWithSecondsFromNow:(NSInteger)seconds;
///传入年、月、日的整数，得到相应日期
+ (NSDate *)dateWithYear:(NSInteger)year month:(NSUInteger)month day:(NSUInteger)day;
- (NSString *)dateWithFormat:(NSString *)format;

//Other
///MM-dd
- (NSString *)MDWithDate;
///yyyy-MM
- (NSString *)YMWithDate;
///yyyy-MM-dd
- (NSString *)YMDWithDate;
///MM月dd日
- (NSString *)MDChineseWithDate;
///HH:mm:ss
- (NSString *)HmsWithDate;
///上午好 还是 下午好
- (NSString *)morningOrAfterWithHH;

//根据项目所需逐步添加的功能


/**
 获得给定时间距现在的时间跨度  ？分钟内  ?小时内   ？天内
 
 @param theDate 给定的时间
 @param DateFormat 给定时间的format
 @return 时间跨度描述
 */
+ (NSString *)timeIntervalSinceNow:(NSString *)theDate withDataFormat:(NSString *)DateFormat;


/**
 根据指定的日期字符串和格式，返回指定的日期格式的字符串
 
 @param giveDateString 指定的日期字符串
 @param formatString 指定的日期格式
 @param resultDateFormat 返回值指定的日期格式
 @return 返回值
 */
+ (NSString *)timeTransitionFromGiveDate:(NSString *)giveDateString andFormat:(NSString *)formatString toDateWithFormat:(NSString *)resultDateFormat;


/**
 给定时间 - 现在的时间 = 返回值 <0 给定时间比现在时间早  >0 给定时间比现在时间晚
 
 @param theDate 给定的时间字符串
 @param formatString 给定时间的格式
 @return 间隔的秒数
 */
+ (NSTimeInterval)timeIntervalSinceNow:(NSString *)theDate withDateFormatString:(NSString *)formatString;


/**
 得到当前时间之前和之后N天的日期
 
 @param NDay 天数 负数之前 正数之后
 @return 日期Date
 */
+ (NSDate *)timeGetDistanceNowDateWithNDay:(NSInteger)NDay;

/**生成当天的某个点（返回的是阳历时间，可直接与当前时间[NSDate date]比较
 @param hour 如hour为“8”，就是上午8:00（本地时间）
 @param minute 如minute为“8”，就是上午8:08（本地时间）
 */
+ (NSDate *)timeGetCustomDateWithHour:(NSInteger)hour minute:(NSInteger)minute;


/**
 两个日期之间的间隔秒数

 @param fromDate 日期1
 @param date 日期2
 @return 间隔秒数 负数:fromDate < date  正数:fromDate > date  0: fromDate = date
 */
+ (NSTimeInterval)timeDistanceSecondsBetweenDate:(NSDate *)fromDate toDate:(NSDate *)date;

/**
 判断当前时间是否在fromDate和hour之后的时间之间
 
 @param fromDate 区间起点
 @param hour 区间间隔
 @return YES在 NO不在
 */
+ (BOOL)timeBetweenFromDate:(NSDate *)fromDate byAddingHourTimeInterval:(NSTimeInterval)hour;

/**
 判断当前时间是否在fromDate和toDate之间
 
 @param fromDate 区间起点
 @param toDate 区间终点
 @return YES在 NO不在
 */
+ (BOOL)timeBetweenFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate;
- (BOOL)timeBetweenFromDate:(NSDate *)fromDate toDate:(NSDate *)toDate;
/**
 获取指定时间之前或者之后 interval秒 的时间
 
 @param interval 秒数，负数代表给定时间之前，正数代表给定时间之后
 @param giveDate 给定时间
 @return 结果时间
 */
+ (NSDate *)timeGetDateWithTimeInterval:(NSTimeInterval)interval fromGiveDate:(NSDate *)giveDate;

/**4
 * 通过指定的NSDate返回 制定格式Format
 * yyyy-MM-dd HH:mm:ss zzz    zzz表示时区，zzz可以删除，这样返回的日期字符将不包含时区信息。
 *如果给定的时间格式中包括a(AM PM) 那么就要设置locale属性进行设置,使得它强制采用“en-US”的方式
 *否则不强制采用“en-US”,那么如果设置中的语言设置是中文 那么a格式就会代表 (上午  下午)
 */
+ (NSString *)timeGetStringFromDate:(NSDate *)date withFormat:(NSString *)format;
+ (NSDate *)timeDateFromDateString:(NSString *)dateString withFormat:(NSString *)formatString;


/**
 获取给定日期星期几字符串 暂时未实现
 
 @param date 给定日期
 @return 星期几
 */
+ (NSString *)timeGetWeekStringFromDate:(NSDate *)date;


/**
 获取距离当前时间的几天的日期数组
 
 @param days 几天
 @param tag YES：future  NO：lately
 @return 日期数组
 */
+ (NSArray <NSDate *> *)timeGetDays:(NSInteger)days withLatelyOrFuture:(BOOL)tag;


/**
 获取距离当前时间的几天的日期字符串数组
 
 @param days 几天
 @param tag YES：future  NO：lately
 @param format 日期format
 @return 日期字符串数组
 */
+ (NSArray <NSString *> *)timeGetDays:(NSInteger)days withLatelyOrFuture:(BOOL)tag dateFormat:(NSString *)format;


/**
 获取距离当前时间的几天的星期字符串数组
 
 @param days 几天
 @param tag YES：future  NO：lately
 @return 星期字符串数组
 */
+ (NSArray <NSString *> *)timeGetWeekdayWithDays:(NSInteger)days withLatelyOrFuture:(BOOL)tag;

@end
